package ch07.proxy.extra.cglibProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @description: 类描述
 * @author: Fesine
 * @createTime:2016/9/10 14:54
 * @update:修改内容
 * @author: Fesine
 * @updateTime:2016/9/10 14:54
 */
public class CglibProxy implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();

    public Object getProxy(Class clz) {
        //设置创建子类的类
        enhancer.setSuperclass(clz);
        enhancer.setCallback(this);
        //通过字节码技术动态创建子类实例
        return enhancer.create();
    }

    /**
     * 拦截所有目录类方法的调用
     * @param o 目标类的实例
     * @param method 目标方法的反射对象
     * @param objects 方法的参数
     * @param methodProxy 代理类的实例
     * @return
     * @throws Throwable
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
            throws Throwable {
        System.out.println("-----日志记录开始-----");
        System.out.println("method:"+method);
        //代理类调用父类的方法
        methodProxy.invokeSuper(o, objects);
        System.out.println("-----日志记录结束-----");
        return null;
    }
}
